
/**
 * 判断是否是微信浏览器
 */
function inWeixin() {
    var ua = navigator.userAgent.toLowerCase();
    return (ua.match(/MicroMessenger/i) == "micromessenger");
}

/**
 * 判断是否是手机浏览器
 */
function inMobile() {
    var userAgent = navigator.userAgent;
    var mobileAgents = ["Android", "iPhone", "Harmony", "SymbianOS", "Windows Phone", "iPod"];
    var bMobile = false;
    for (var agent in mobileAgents) {
        if (userAgent.indexOf(agent) > 0) {
            bMobile = true;
            break;
        }
    }
    return bMobile;
}

/**
 * ajax请求
 * 
 * ajax({
 *  url: ...,
 *  success: function(ret) {
 *  
 *  },
 * });
 */
function ajax(options) {
    return $.ajax({
        url: options.url,
        method: options.method ? options.method : 'get',
        dataType: options.dataType ? options.dataType : 'json',
        data: options.data,
        success: function (ret) {

            if (ret.code == -500) {
                top.location.href = ret.msg;
                return false;
            }

            options.success && options.success(ret);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            options.error && options.error(textStatus);
        },
        complete: function (XMLHttpRequest, textStatus) {
            if (XMLHttpRequest.readyState == 4) {
                options.complete && options.complete(textStatus);
            }
        }
    }).catch((e) => {
    });
}

/**
 * 整数转换
 */
function toInt(string) {
    return isNaN(parseInt(string)) ? 0 : parseInt(string);
}

/**
 * 小数转换
 */
function toFloat(string) {
    return isNaN(parseFloat(string)) ? 0 : parseFloat(string);
}

/**
 * 4舍5入
 */
function xround(x, num) {
    x = parseFloat(x);
    num = parseInt(num);
    return Math.round(x * Math.pow(10, num)) / Math.pow(10, num);
}

/**
 * 4舍5入，保留2为小数
 */
function xround2(x) {
    x = parseFloat(x);
    return Math.round(x * Math.pow(10, 2)) / Math.pow(10, 2);
}

function scrollTo(id) {
    location.replace('#' + id);
    var t = $(window).scrollTop();
    $('body,html').animate({'scrollTop': t - 50}, 100);
}

function reDrawValidateImage(e, url) {
    var r = Math.random();
    if (url) {
        e.src = url + '?' + r;
    } else {
        e.src = "/code/index?" + r;
    }
}

/**
 * url地址解析
 */
function parseUrl(url) {
    var a = document.createElement('a');
    a.href = url;
    return {
        source: url,
        protocol: a.protocol.replace(':', ''),
        host: a.hostname,
        port: a.port,
        query: a.search,
        params: (() => {
            var ret = {}, querys = [];
            var searchQuery = a.search.replace(/^\?/, '').split('&');
            for (var i = 0; i < searchQuery.length; i++) {
                if (searchQuery[i]) {
                    querys = searchQuery[i].split('=');
                    ret[querys[0]] = querys[1];
                }
            }
            return ret;
        })(),
        file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
        hash: a.hash.replace('#', ''),
        path: a.pathname.replace(/^([^\/])/, '/$1'),
        relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
        segments: a.pathname.replace(/^\//, '').split('/')
    };
}

/**
 * 设置url参数
 */
function urlSetParam(url, key, value) {
    var reg = eval('/(' + key + '=)([^&]*)/gi');

    if (url.indexOf(key + '=') > -1) {
        return url.replace(reg, key + '=' + value);
    } else {
        if (url.indexOf('\?') > -1) {
            var urlArr = url.split('\?');
            if (urlArr[1]) {
                return urlArr[0] + '?' + key + '=' + value + '&' + urlArr[1];
            } else {
                return urlArr[0] + '?' + key + '=' + value;
            }
        } else {
            if (url.indexOf('#') > -1) {
                return url.split('#')[0] + '?' + key + '=' + value + location.hash;
            } else {
                return url + '?' + key + '=' + value;
            }
        }
    }
}

Array.prototype.move = function (findex, tindex) {
    this.splice(toInt(tindex), 0, this.splice(toInt(findex), 1)[0]);
}

/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * var time1 = new Date().Format("yyyy-MM-dd");
 * var time2 = new Date().Format("yyyy-MM-dd hh:mm:ss");
 * (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
 * (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
 * @param {Object} fmt
 */
Date.prototype.Format = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "h+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

/**
 * 判断字符串是否是日期格式
 */
function isDate(dateStr) {
    var result = dateStr.toString().match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})/);

    if (result == null)
        return false;
    var d = new Date(result[1], result[3] - 1, result[4]);
    return (d.getFullYear() == result[1] && (d.getMonth() + 1) == result[3] && d.getDate() == result[4]);
}


var Verifier = {
    int: function (str) {
        return /^-?\d+$/.test(str);
    },
    float: function (str) {
        return /^(-?\d+)(\.\d+)?$/.test(str);
    },
    china: function (str) {
        return /^[\u4E00-\u9FA5]+$/.test(str);
    },
    haschina: function (str) {
        return /[\u4E00-\u9FA5]/.test(str);
    },
    email: function (str) {
        return /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([_a-z0-9]+\.)+[a-z]{2,5}$/.test(str);
    },
    mobile: function (str) {
        return /^((\(\d{2,3}\))|(\d{3}\-))?1[3|4|5|7|8|9]\d{9}$/.test(str);
    },
    idcard: function (str) {
        return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
    },
    hkid: function (str) {

        if (!/^[a-zA-Z][0-9]{6}[0-9aA]$/.test(str)) {
            return false;
        }

        var hash = (str.substring(0, 1).toUpperCase().charCodeAt() - 64) * 8;
        for (var i = 1; i <= 6; i++) {
            hash += parseInt(str.substring(i, i + 1)) * (8 - i);
        }
        var validateNo = hash % 11;
        var ret = "";
        if (validateNo == 1) {
            ret = "A";
        } else {
            ret = 11 - validateNo;
        }

        return ret == str.substring(7, 8).toUpperCase();
    }
};

/**
 * 创建一个有防抖功能的函数
 *
 * 防抖，在一段连续操作结束后，处理回调
 *
 * 如果你需要等待某个操作完成后才执行，比如用户输入过程中不要搜索，停止输入一段时间后才进行搜索，那么防抖合适
 *
 * @param fn
 * @param delay
 * @returns {(function(): void)|*} 返回一个有防抖功能的函数
 */
function debounce(fn, delay) {
    var timer; // 维护一个 timer
    return function () {
        var _this = this; // 取debounce执行作用域的this
        var args = arguments;
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(function () {
            fn.apply(_this, args); // 用apply指向调用debounce的对象，相当于_this.fn(args);
        }, delay);
    };
}

/**
 * 创建一个有节流功能的函数
 *
 * 节流，在一段连续操作中，每一段时间只执行一次
 *
 * 如果你需要限制事件的触发频率，比如连续按键，但每隔1秒才能接受一个输入，节流就合适
 *
 * @param fn
 * @param delay
 * @returns {(function(): void)|*} 返回一个有节流功能的函数
 */
function throttle(fn, delay) {
    var timer;
    return function () {
        var _this = this;
        var args = arguments;
        if (timer) {
            return;
        }
        timer = setTimeout(function () {
            fn.apply(_this, args);
            timer = null; // 在delay后执行完fn之后清空timer，此时timer为假，throttle触发可以进入计时器
        }, delay)
    }
}

/**
 * 获取当前页面URL的GET参数
 */
function getGet(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);//search,查询？后面的参数，并匹配正则
    if (r != null)
        return decodeURI(r[2]);
    return null;
}

/**
 * 获取当前页面URL
 */
function GetCurrentUrl() {
    return window.location.protocol + '//' + window.location.host + window.location.pathname;
}

/**
 * 处理微信内使用location.reload(true)不刷新页面
 */
function vurl(url, key) {
    var key = (key || 't') + '=';  //默认是"t"
    var reg = new RegExp(key + '\\d+');  //正则：t=1472286066028
    var timestamp = +new Date();
    if (url.indexOf(key) > -1) { //有时间戳，直接更新
        return url.replace(reg, key + timestamp);
    } else {  //没有时间戳，加上时间戳
        if (url.indexOf('\?') > -1) {
            var urlArr = url.split('\?');
            if (urlArr[1]) {
                return urlArr[0] + '?' + key + timestamp + '&' + urlArr[1];
            } else {
                return urlArr[0] + '?' + key + timestamp;
            }
        } else {
            if (url.indexOf('#') > -1) {
                return url.split('#')[0] + '?' + key + timestamp + location.hash;
            } else {
                return url + '?' + key + timestamp;
            }
        }
    }
}

/**
 * 数据缓存
 */
function cache(key, value, expire) {
    var timestamp = parseInt(new Date().getTime() / 1000);
    if (arguments.length === 1) {
        var data = localStorage.getItem(key);
        if (!!data) {
            data = JSON.parse(data);
            if (!!(data.expire) && data.expire < timestamp) {
                cache(key, false);
                return false;
            }
            return data.value;
        } else {
            return false;
        }
    }

    if (arguments.length > 1) {
        if (value === false) {
            localStorage.removeItem(key);
        } else {
            var data = {
                value: value,
                expire: !!expire ? timestamp + expire : 0
            };
            localStorage.setItem(key, JSON.stringify(data));
        }
    }
}

/**
 * 获取一个cache还有多少秒过期
 * @param string key
 */
function cache_expiring_seconds(key) {
    var timestamp = parseInt(new Date().getTime() / 1000);
    var data = localStorage.getItem(key);
    if (!!data) {
        data = JSON.parse(data);
        if (!!(data.expire) && data.expire < timestamp) {
            return false;
        }
        return data.expire;
    } else {
        return false;
    }
}

$(function () {

    $(".nav-back").click(function () {
        history.back(-1);
    });
    
    if (history.length === 1) {
        $(".nav-back").children().hide();
    }

    // 启用copy
    $("body").on('click', '.clip', function () {
        $.copy({
            content: $(this).data('clip'),
            callback: function () {
                $.toast('已复制到剪贴板');
            }
        });
    });

    // iframe 高度自适应
    if (parent != self && typeof (parent.resizeIframe) == 'function') {
        setInterval(function () {
            parent.resizeIframe(document.body.scrollHeight);
        }, 200);
    }

    // 启用tooltip
    if (jQuery.isFunction(jQuery.fn.tooltip)) {
        $('[data-toggle="tooltip"]').tooltip();
    }

    // 启用popover
    if (jQuery.isFunction(jQuery.fn.popover)) {
        $('[data-toggle="popover"]').popover();
    }

    //必须for each，如果直接laydate.render用css选择器会导致同一个页面多个元素时，除第一外，其他点击闪退的问题
    if (typeof (laydate) != 'undefined') {

        $(".datepicker").each(function () {
            laydate.render({
                elem: this,
            });
        });

        $(".timepicker").each(function () {
            laydate.render({
                elem: this,
                type: 'time',
            });
        });

        $(".datetimepicker").each(function () {
            laydate.render({
                elem: this,
                type: 'datetime',
            });
        });

        $(".daterangepicker").each(function () {
            laydate.render({
                elem: this,
                range: '到',
            });
        });
    }

});